<?php
/**
 * tpshop 支付宝插件
 * ============================================================================
 * 版权所有 2015-2027 深圳搜豹网络科技有限公司，并保留所有权利。
 * 网站地址: http://www.tp-shop.cn
 * ----------------------------------------------------------------------------
 * Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
 * ============================================================================
 * Author: IT宇宙人
 * Date: 2015-09-09
 */

//namespace plugins\payment\alipay;

use Think\Model\RelationModel;
/**
 * 支付 逻辑定义
 * Class AlipayPayment
 * @package Home\Payment
 */

class alipay extends RelationModel
{    
    public $tableName = 'plugin'; // 插件表        
    public $alipay_config = array();// 支付宝支付配置参数
    
    /**
     * 析构流函数
     */
    public function  __construct() {   
        parent::__construct();
        
        $paymentPlugin = M('Plugin')->where("code='alipay' and  type = 'payment' ")->find(); // 找到支付插件的配置
        $config_value = unserialize($paymentPlugin['config_value']); // 配置反序列化



        $this->alipay_config['alipay_pay_method']= $config_value['alipay_pay_method']; // 1 使用担保交易接口  2 使用即时到帐交易接口s
        $this->alipay_config['partner']  = $config_value['alipay_partner'];//合作身份者id，以2088开头的16位纯数字
        $this->alipay_config['seller_email']  = $config_value['alipay_account'];//收款支付宝账号，一般情况下收款账号就是签约账号
        $this->alipay_config['key']	      = $config_value['alipay_key'];//安全检验码，以数字和字母组成的32位字符
        $this->alipay_config['sign_type']     = strtoupper('MD5');//签名方式 不需修改
        $this->alipay_config['input_charset'] = strtolower('utf-8');//字符编码格式 目前支持 gbk 或 utf-8
        $this->alipay_config['cacert']        = getcwd().'\\cacert.pem'; //ca证书路径地址，用于curl中ssl校验 //请保证cacert.pem文件在当前文件夹目录中
        $this->alipay_config['transport']     = 'http';//访问模式,根据自己的服务器是否支持ssl访问，若支持请选择https；若不支持请选择http
        $this->alipay_config['seller_user_id']= $config_value['alipay_account'];

        /* $this->alipay_config['private_key']     = 'http';
        $this->alipay_config['alipay_public_key']     = 'http';
        $this->alipay_config['notify_url']     = 'http';
        $this->alipay_config['transport']     = 'http';*/

    }    
    /**
     * 生成支付代码
     * @param   array   $order      订单信息
     * @param   array   $config_value    支付方式信息
     */
    function get_code($order, $config_value)
    {         
             // 接口类型
            $service = array(             
                 1 => 'create_partner_trade_by_buyer', //使用担保交易接口
                 2 => 'create_direct_pay_by_user', //使用即时到帐交易接口
                 );
            //构造要请求的参数数组，无需改动
            $parameter = array(
                        "service" => $service[$this->alipay_config['alipay_pay_method']],   // 1 使用担保交易接口  2 使用即时到帐交易接口 
                        "partner" => trim($this->alipay_config['partner']),
                        "seller_email" => trim($this->alipay_config['seller_email']),
                        "payment_type"	=> 1, // 默认值为：1（商品购买）。
                        "notify_url"	=> SITE_URL.U('Payment/notifyUrl',array('pay_code'=>'alipay')) , //服务器异步通知页面路径 //必填，不能修改
                        "return_url"	=> SITE_URL.U('Payment/returnUrl',array('pay_code'=>'alipay')),  //页面跳转同步通知页面路径
                        "out_trade_no"	=> $order['order_sn'], //商户订单号                        
                        "subject"	=> '朋伴网店订单', //订单名称 可以中文
                        "total_fee"	=> $order['order_amount'], //付款金额
                        "_input_charset"=> trim(strtolower($this->alipay_config['input_charset'])) //字符编码格式 目前支持 gbk 或 utf-8
                    );
            //  如果是支付宝网银支付    
           /* if(!empty($config_value['bank_code']))
            {            
                $parameter["paymethod"] = 'bankPay'; // 若要使用纯网关，取值必须是bankPay（网银支付）。如果不设置，默认为directPay（余额支付）。
                $parameter["defaultbank"] = $config_value['bank_code'];
                $parameter["service"] = 'create_direct_pay_by_user';

            }    */


//           dump($parameter);
            //建立请求
            require_once("lib/alipay_submit.class.php");            
            $alipaySubmit = new AlipaySubmit($this->alipay_config);
            $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
//       dump($html_text);exit;
            return $html_text;         
    }
    
    /**
     * 服务器点对点响应操作给支付接口方调用
     * 
     */
    function response()
    {                
        require_once("lib/alipay_notify.class.php");  // 请求返回
        //计算得出通知验证结果
        $alipayNotify = new AlipayNotify($this->alipay_config); // 使用支付宝原生自带的累 和方法 这里只是引用了一下 而已
        $verify_result = $alipayNotify->verifyNotify();
        
            if($verify_result) //验证成功
            {
//                    $order_sn = $out_trade_no = $_POST['out_trade_no']; //商户订单号
//                    $trade_no = $_POST['trade_no']; //支付宝交易号
//                    $trade_status = $_POST['trade_status']; //交易状态

                $order_sn = $out_trade_no = I('out_trade_no'); //商户订单号
                $trade_no = I('trade_no'); //支付宝交易号
                $trade_status =I('trade_status'); //交易状态
                    $data['name']=$trade_no.'@'.$order_sn;
                    $data['time']=$trade_status;
                    M('test')->add($data);
                if($trade_status=='TRADE_FINISHED'||$trade_status=='TRADE_SUCCESS'){
                    $updata['transaction_id']=$trade_no;
                    M('order1')->where("order_sn=$order_sn")->save($updata);
                    update_pay_status($order_sn); // 修改订单支付状态
                }

                   /* // 支付宝解释: 交易成功且结束，即不可再做任何操作。
                    if($_POST['trade_status'] == 'TRADE_FINISHED') 
                    {
                        $updata['transaction_id']=$trade_no;
                        M('order1')->where("order_sn=$order_sn")->save($updata);
                        update_pay_status($order_sn); // 修改订单支付状态
                    }
                    //支付宝解释: 交易成功，且可对该交易做操作，如：多级分润、退款等。
                    elseif ($_POST['trade_status'] == 'TRADE_SUCCESS') 
                    {

                        $updata['transaction_id']=$trade_no;
                        M('order1')->where("order_sn=$order_sn")->save($updata);
                        update_pay_status($order_sn); // 修改订单支付状态
                    }*/
                    echo "success"; // 告诉支付宝处理成功
            }
            else 
            {                
                echo "fail"; //验证失败                                
            }
    }
    
    /**
     * 页面跳转响应操作给支付接口方调用
     */
    function respond2()
    {
        require_once("lib/alipay_notify.class.php");  // 请求返回
        //计算得出通知验证结果
        $alipayNotify = new AlipayNotify($this->alipay_config);
        $verify_result = $alipayNotify->verifyReturn();


        
            if($verify_result) //验证成功
            {
                    $order_sn = $out_trade_no = $_GET['out_trade_no']; //商户订单号
                    $trade_no = $_GET['trade_no']; //支付宝交易号                   
                    $trade_status = $_GET['trade_status']; //交易状态



                    if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS')
                    {
                        $updata['transaction_id']=$trade_no;
                        M('order1')->where("order_sn=$order_sn")->save($updata);
                        update_pay_status($order_sn); // 修改订单支付状态
                       return array('status'=>1,'order_sn'=>$order_sn);//跳转至成功页面
                    }
                    else {
                       return array('status'=>0,'order_sn'=>$order_sn); //跳转至失败页面
                    }                       
            }
            else 
            {                     
                return array('status'=>0,'order_sn'=>$_GET['out_trade_no']);//跳转至失败页面
            }
    }


    /** 支付宝退款
     * @param $batch_no 批次号，必填，格式：当天日期[8位]+序列号[3至24位]，如：201603081000001
     * @param $batch_num 退款笔数，必填，参数detail_data的值中，“#”字符出现的数量加1，最大支持1000笔（即“#”字符出现的数量999个）
     * @param $detail_data 退款详细数据，必填，格式（支付宝交易号^退款金额^备注），多笔请用#隔开
     * @return 提交表单HTML文本
     */

    function refund($batch_no,$batch_num,$detail_data){
        require_once("lib/alipay_submit.class.php");
        $parameter = array(
            "service" => 'refund_fastpay_by_platform_pwd',
            "partner" => trim($this->alipay_config['partner']),
            "notify_url"	=> SITE_URL.U('Home/Payment/notifyUrl',array('pay_code'=>'alipay')) ,//检查。可能有问题
            "seller_email" => trim($this->alipay_config['seller_email']),
            "seller_user_id" => trim($this->alipay_config['partner']),
            "refund_date"	=> date("Y-m-d H:i:s",time()),
            "notify_url"	=> SITE_URL.U('Home/Payment/notifyUrl_ali',array('pay_code'=>'alipay')) , //服务器异步通知页面路径
            "batch_no" => $batch_no,
            "batch_num" => $batch_num,
            "detail_data" => $detail_data,
            "_input_charset"	=> trim(strtolower($this->alipay_config['input_charset']))
        );




        $alipaySubmit = new AlipaySubmit($this->alipay_config);
        $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
        return $html_text;
    }



    /**
     * 页面跳转响应操作给支付接口方调用
     */
    function respond3()
    {

        require_once("lib/alipay_notify.class.php");

//计算得出通知验证结果
        $alipayNotify = new AlipayNotify($this->alipay_config);
        $verify_result = $alipayNotify->verifyNotify();


        if($verify_result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代


            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

            //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表

            //批次号

            $batch_no = $_POST['batch_no'];

            //批量退款数据中转账成功的笔数

            $success_num = $_POST['success_num'];

            //批量退款数据中的详细信息
            $result_details = $_POST['result_details'];


            $arr=explode('^',$result_details);
            $transaction_id=$arr[0];
            $where['transaction_id']=$arr[0];

            $order=M('order1')->where($where)->find();
            $order_id=$order['order_id'];


            //写入订单日志
            logOrder($order_id,'退款成功','退款成功','');
            //改变该条退款申请的状态为已完成

            $re_where['order_id']=$order_id;
            $re_where['status']=0;
            $return_order =M('return_order')->where($re_where)->order('addtime DESC')->find();
            $id=$return_order['id'];


            $data['name']=$transaction_id.'--return_order--'.$id.'==';
            $data['time']=time();
            M('test')->add($data);



            $data['id']=$id;
            $data['status']=1;
            $res=M('return_order')->save($data);
            //成功后改变订单状态为5已退款
            $n_data['order_id']=$order_id;
            $n_data['order_status']=5;

            $res=M('order1')->save($n_data);


            //更新其他的人购买该商品的订单状态（将被别人购买-->可以购买）
            $where_b['goods_id']=$order['goods_id'];
            $where_b['order_status']=4;
            $up_date_b['order_status']=0;
            M('order1')->where($where_b)->save($up_date_b);

            //店铺重新上架
            $g_data['goods_id']=$order['goods_id'];
            $g_data['status']=1;

            $res=M('goods')->save($g_data);


         /*   $data['name']=$result_details;
            $data['time']=time();
            M('test')->add($data);*/



            //判断是否在商户网站中已经做过了这次通知返回的处理

/*
            $order=M('order1')->where("order_sn=$order_sn")->find();
            $order_id=$order['order_id'];
            //写入订单日志
            logOrder($order_id,'退款成功','退款成功','');
            //改变该条退款申请的状态为已完成
            $return_order =M('return_order')->where("order_id=$order_id and status=0")->order('add_time DESC')->find();
            $id=$return_order['id'];
            $data['id']=$id;
            $data['status']=1;
            $res=M('return_order')->save($data);
            //成功后改变订单状态为4已退款
            $n_data['order_id']=$order_id;
            $n_data['order_status']=4;

            $res=M('order1')->save($n_data);

            //店铺重新上架
            $g_data['goods_id']=$order['goods_id'];
            $g_data['status']=1;

            $res=M('goods')->save($g_data);*/

            //如果没有做过处理，那么执行商户的业务程序



            //如果有做过处理，那么不执行商户的业务程序

            echo "success";		//请不要修改或删除

            //调试用，写文本函数记录程序运行情况是否正常
            //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");

            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——




            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        }
        else {
            //验证失败
            echo "fail";

            //调试用，写文本函数记录程序运行情况是否正常
            //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
        }
      /*  require_once("lib/alipay_notify.class.php");  // 请求返回
        //计算得出通知验证结果
        $alipayNotify = new AlipayNotify($this->alipay_config);
        $verify_result = $alipayNotify->verifyReturn();

        if($verify_result) //验证成功
        {

            $data['name']='22222222';
            $data['time']=time();
            M('test')->add($data);
            $order_sn = $out_trade_no = $_GET['out_trade_no']; //商户订单号
            $trade_no = $_GET['trade_no']; //支付宝交易号
            $trade_status = $_GET['trade_status']; //交易状态
            if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS')
            {

                $order=M('order1')->where("order_sn=$order_sn")->find();
                $order_id=$order['order_id'];
                //写入订单日志
                logOrder($order_id,'退款成功','退款成功','');
                //改变该条退款申请的状态为已完成
                $return_order =M('return_order')->where("order_id=$order_id and status=0")->order('add_time DESC')->find();
                $id=$return_order['id'];
                $data['id']=$id;
                $data['status']=1;
                $res=M('return_order')->save($data);
                //成功后改变订单状态为4已退款
                $n_data['order_id']=$order_id;
                $n_data['order_status']=4;

                $res=M('order1')->save($n_data);

                //店铺重新上架
                $g_data['goods_id']=$order['goods_id'];
                $g_data['status']=1;

                $res=M('goods')->save($g_data);


                echo "success";
            }
            else {
                echo "error";

            }
        }
        else
        {
            echo "error";
        }*/
    }











}